package cn.edu.njtc.util;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class QRCodeDisplayUtil {
    public static void displayQRCode(String filePath) {
        System.out.println("尝试显示二维码: " + filePath);

        // 检查文件是否存在
        File qrCodeFile = new File(filePath);
        if (!qrCodeFile.exists()) {
            System.err.println("错误: 二维码文件不存在 - " + filePath);
            showErrorDialog("错误", "二维码文件不存在: " + filePath);
            return;
        }

        // 检查是否是文件
        if (!qrCodeFile.isFile()) {
            System.err.println("错误: 指定路径不是文件 - " + filePath);
            showErrorDialog("错误", "指定路径不是文件: " + filePath);
            return;
        }

        try {
            // 读取图片
            BufferedImage image = ImageIO.read(qrCodeFile);

            // 在事件调度线程中创建和显示GUI
            SwingUtilities.invokeLater(() -> {
                try {
                    // 创建并配置窗口
                    JFrame frame = new JFrame("二维码显示");
                    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frame.setSize(image.getWidth() + 50, image.getHeight() + 50);

                    // 添加图片标签
                    JLabel imageLabel = new JLabel(new ImageIcon(image));
                    JScrollPane scrollPane = new JScrollPane(imageLabel);
                    frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

                    // 添加窗口关闭监听器
                    frame.addWindowListener(new WindowAdapter() {
                        @Override
                        public void windowClosed(WindowEvent e) {
                            // 窗口关闭后删除二维码文件
                            deleteQRCodeFile(filePath);
                        }
                    });

                    // 显示窗口
                    frame.pack();
                    frame.setLocationRelativeTo(null); // 居中显示
                    frame.setVisible(true);

                    System.out.println("二维码窗口已成功显示");
                } catch (Exception e) {
                    System.err.println("显示二维码窗口时出错: " + e.getMessage());
                    e.printStackTrace();
                    showErrorDialog("显示错误", "无法显示二维码: " + e.getMessage());
                }
            });
        } catch (IOException e) {
            System.err.println("读取二维码图片时出错: " + e.getMessage());
            e.printStackTrace();
            showErrorDialog("读取错误", "无法读取二维码图片: " + e.getMessage());
        }
    }

    private static void deleteQRCodeFile(String filePath) {
        System.out.println("尝试删除二维码文件: " + filePath);
        File file = new File(filePath);

        if (file.exists() && file.isFile()) {
            try {
                if (file.delete()) {
                    System.out.println("二维码文件已成功删除: " + filePath);
                } else {
                    System.err.println("删除二维码文件失败: " + filePath);
                }
            } catch (SecurityException e) {
                System.err.println("安全限制，无法删除二维码文件: " + filePath);
                e.printStackTrace();
            }
        } else {
            System.out.println("二维码文件不存在或不是文件，无需删除: " + filePath);
        }
    }

    private static void showErrorDialog(String title, String message) {
        // 确保在事件调度线程中显示对话框
        SwingUtilities.invokeLater(() -> {
            JOptionPane.showMessageDialog(
                    null,
                    message,
                    title,
                    JOptionPane.ERROR_MESSAGE
            );
        });
    }
}